import axios from 'axios'
import { Toast, Loading } from 'cube-ui'
import router from '../router/index'
import store from '../store'
import * as types from '../store/types'
class Ajaxrequest{
    constructor(){
        this.baseURL = 'http://localhost:8080/api/'; //基准URL
        this.timeout = 3000;//超时时间
        this.queue = {};//请求队列
    }
    merge(options){
        return {...options,baseURL:this.baseURL,timeout:this.timeout}
    }
    request(options){
        // 创建 axios 实例
        let instance = axios.create()
        //  设置拦截器
        this.setinterceptors(instance,options.url)
        // 合并配置
        let config = this.merge(options)
        return instance(config)
    }
    setinterceptors(instance,url){
        // 请求拦截器
        instance.interceptors.request.use(config=>{
        console.log('请求发出:',config)
            // 如果请求队列为空 显示 loading 界面
            if(Object.keys(this.queue).length===0){
                //显示Loading
                // store.commit('showLoading')
            }
            this.queue[url] = URL;
            return config
        })
        // 响应拦截器
        instance.interceptors.response.use(res=>{
            console.log('请求返回res:',res)
            console.log('请求返回:',res.data)
            // 响应请求 移除请求队列
            delete this.queue[url]
            // 如果请求为空 关闭loading 界面
            if(Object.keys(this.queue).length===0){
                // 关闭loading
                // store.commit('hideLoading')
            }
            // 返回的数据里面有状态码并且以4开头 提示信息
            if(res.data.code===1){
                Toast.$create({
                    type: 'txt',
                    txt: res.data.msg,
                    time: 2000
                }).show(); 
                switch(res.data.status){
                    case 403:
                        store.dispatch("account/"+[types.TO_LOGOUT])
                    case 401:
                        /*由于cookie 设置了过期时间 到达时间cookie 也会一并删除
                          当cookie 删除后 后台获取获取不到cookie中token 便无法校验token
                          */
                        if(store.state.account.login){
                            // 清除用户数据
                            store.dispatch("account/"+types.TO_LOGOUT)
                            // 清除购买列表
                            store.commit("course/"+types.SET_ORDER_COURSE,[])
                        }
                }
                return false
            }
            return res.data
        },
        error => {
            console.log('请求失败返回:',error)
            if (error.response.status) {
                switch (error.response.status) {
                    // 401: 未登录
                    // 清楚登陆信息
                    // 未登录则跳转登录页面，并携带当前页面的路径
                    // 在登录成功后返回当前页面，这一步需要在登录页操作。                
                    case 401:
                            // 清除用户数据
                            store.dispatch('account/'+types.TO_LOGOUT)
                            // 清除购买列表
                            store.commit("course/"+types.SET_ORDER_COURSE,[])
                            // 清除购买列表
                            router.replace({
                                path: '/login'
                            });
                        break;
                    // 403 token过期
                    // 清楚登陆信息
                    // 登录过期对用户进行提示
                    // 清除本地token和清空vuex中token对象
                    // 跳转登录页面                
                    case 403:
                        Toast.$create({
                            type: 'txt',
                            txt: '登录过期，请重新登录',
                            time: 1000,
                            onTimeout:()=>{
                                router.replace({
                                    path: '/login'
                                });
                                store.commit('logout')
                            }
                        });
                        break;
    
                    // 404请求不存在
                    case 404:
                        Toast.$create({
                            type: 'txt',
                            txt: '资源请求不存在',
                            time: 2000
                        }).show()
                        break;
                    // 其他错误，直接抛出错误提示
                    default:
                        Toast.$create({
                            type: 'txt',
                            txt: error.response.data,
                            time: 2000
                        }).show();
                }
                return Promise.reject(error.response);
            }
        }) 
    }
}


export default new Ajaxrequest;
